#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
/* ---------- 此处定义见小白专场 -------------- */
#define MaxTree 10
#define ElementType int
#define Tree int
#define Null -1
/* ---------- 此处定义见小白专场 -------------- */
struct TreeNode
{
    ElementType Element;
    Tree Left;
    Tree Right;
} T1[MaxTree];
//在这里直接定义除了T1,T2两个树

//构建树结构
Tree BuildTree(struct TreeNode T[]);

void PrintOrder(R);
bool IsPrint[MaxTree];
int N;
int main()
{
    Tree R1;
    R1 = BuildTree(T1);
    PrintOrder(R1);
    // for (int i = 0; i < N;i++)
    // {
    //     if(IsPrint[i])

    // }

    return 0;
}

Tree BuildTree(struct TreeNode T[])
{
    int i,check[MaxTree];//Tree的大小
    char cl, cr;//临时存储输入字符
    Tree Root = Null;
    scanf("%d\n", &N);
    if (N)
    {
        //用来检查根在哪里
        for (i = 0; i < N; i++)
        {
            check[i] = 0;
            
        }
        for (i = 0; i < N; i++)
        {
            T[i].Element = i;
            scanf("%c %c\n", &cl, &cr);
            if(cl!='-')
            {
                T[i].Left = cl - '0';
                check[T[i].Left] = 1;//也就是说Left是有人指向的 对应的那个人就不是根节点
            }
            else
                T[i].Left = Null;

            if(cr!='-')
            {
                T[i].Right = cr - '0';
                check[T[i].Right] = 1;//也就是说Left是有人指向的 对应的那个人就不是根节点
            }
            else
                T[i].Right = Null;
        }
        for (i = 0; i < N ; i++)
            if (!check[i])
                break;
        Root = i;
    }
    return Root;
}
void PrintOrder(Tree R)
{
    if(R!=Null)
    {
        PrintOrder(T1[R].Left);
        if(T1[R].Left == Null && T1[R].Right == Null)
        {
            printf("%d\n", R);
            IsPrint[R] = true;
        }    
        PrintOrder(T1[R].Right);
    }
    // Tree Tleft = R;
    // Tree Tright = R;
    // for (int i = 0; i < N;i++)
    // {
    //     if(T1[Tleft].Left == Null && T1[Tleft].Right == Null)
    //     {
    //         // IsPrint[R] = true;
    //         printf("%d\n", Tleft);
    //     }
    //     else if(T1[Tright].Left == Null && T1[Tright].Right == Null)
    //     {
    //         printf("%d\n", Tright);
    //     }
    //     else if(T1[Tleft].Left !=Null)
    //     {
    //         Tleft = T1[Tleft].Left;
    //     }
    //     else if(T1[Tright].Right !=Null)
    //     {
    //         Tleft = T1[Tright].Right;
    //     }

    // }
    // if(T1[R].Left == Null && T1[R].Right == Null)
    // {
    //     IsPrint[R] = true;
    //     printf("%d\n", R);
    // }
    // else if(T1[R].Left!=Null)
    // {
    //     // Height[T1[R].Left] = Height[R] + 1;
    //     PrintOrder(T1[R].Left);
    // }
    // else if(T1[R].Right!=Null)
    // {
    //     // Height[T1[R].Right] = Height[R] + 1;
    //     // Width[T1[R].Right] = Width[T1[R].Right] + 2;
    //     PrintOrder(T1[R].Right);
    // }
}